# encoding: utf-8
# @author: luzhangdan
# @file: parse.py
# @time: 2021/10/19 14:34

import json
import re
import jsonpath
import pytest
from common.logger import GetLogger
from common.mysql_utils import DBSSHHelper

logger = GetLogger().get_logger()
vars_dict = {}


def regx_sub_vars(content):
    """
    替换excel中的变量
    :param content:
    :return:
    """
    # 对请求头的变量进行替换
    try:
        result = re.findall(r"\$\{([^\{].+?)\}", content)
        logger.info('匹配到的结果是{}'.format(result))

        # 通过key 在vars_dict里面找到对应的value值，然后把${key}做替换re.sub()替换,替换成value值
        # 新的字符串=re.sub(r'',新的值,目标字符串)
        for key in result:
            value = vars_dict.get(key)
            logger.info('从vars_dict里面获取{}对应的值是{}'.format(key, value))
            # 替换变量
            content = re.sub(r"\$\{" + key + "\}", str(value), content)
            logger.info(f"替换变量后的整体数据是：{content}")
        return content
    except Exception as e:
        logger.info(f"替换excel中的变量异常，异常信息是：{e}")


def get_jsonpath_value(obj, expr, index=0):
    """
    jsonpath去提取数据
    :param obj:  json字符串， res.text
    :param expr:  jsonpath表达式
    :param index:  索引值，获取列表中的元素
    :return:  目标元素
    """
    try:
        # 判断obj是否字符串
        if isinstance(obj, str):
            obj = json.loads(obj)
        value_list = jsonpath.jsonpath(obj, expr)
        logger.info(f"通过jspnpath表达式获取到的结果是：{value_list}")
        if index == 0:
            # 获取列表中第一个元素
            return value_list[0]
        elif index > 0:
            # 返回列表中具体的元素
            return value_list[index]
        else:
            # 返回整个列数
            return value_list
    except Exception as e:
        logger.info(f"jsonpath提取数据异常，异常信息是：{e}")
        return False


def replace_var(content, var_value):
    """
    替换url中的变量
    :param content: 字符串
    :param var_value: 需替换的值
    :return:
    """
    try:
        if content:
            re_result = re.findall(r"\$\{([^\{].+?)\}", content)
            logger.info(f"正则匹配获取到的re_result：{re_result}")
            # 通过正则匹配，替换url中的变量
            content = re.sub(r"\$\{" + re_result[0] + "\}", str(var_value), content)
            return content
    except Exception as e:
        logger.info(f"替换变量异常：{e}")


def db_assert_parse(db_assert, response):
    try:
        if db_assert != "":
            # 转换为字典格式
            db_assert = eval(db_assert)
            logger.info(f"数据库断言的内容是：{db_assert}")
            # 获取需要执行的sql
            sql = db_assert.get("sql")
            logger.info(f"获取到的sql语句是：{sql}")
            # 执行sql语句，获取sql结果数据
            db_helper = DBSSHHelper().connection_database()
            db_result = db_helper.sql_select(sql)
            logger.info(f"sql执行的结果是：{db_result}")
            # 遍历数据，元素是字典格式
            for i in range(len(db_result)):
                for k, v in db_assert.items():
                    if k != "sql":
                        # 通过jsonpath 表达式从接口响应中获取值
                        logger.info(f"从excel的数据中获取到的jsonpath表达式是：{v}")
                        value = get_jsonpath_value(response.text, v, index=i)
                        logger.info(f"通过jsonpath获取到的值是：{value}")
                        # 从数据库结果中，通过k获取value
                        db_data = db_result[i].get(k)
                        logger.info(f"获取到数据库中断言的值是：{db_data}")
                        pytest.assume(db_data == value)
    except Exception as e:
        logger.info(f"数据库断言异常，异常信息是：{e}")
